package com.example.cryptodemo.aes;

/**
 * 消息，假定是公开的，
 * 任何人都能看到
 *
 * @author Yunkai Luo
 * @since 14:08 2021/11/2
 **/
public class Message<T> {
    /**
     * 发送类型
     * 0: JSON
     * 1: XML
     * 写死为0
     */
    private final Integer postType = 0;
    /**
     * 加密数据
     */
    private String encryptedData;
    /**
     * 未加密数据
     */
    private T data;
    /**
     * 时间戳，用URL参数的timestamp
     */
    private String timeStamp;
    /**
     * 随机串，用URL参数的nonce
     */
    private String nonce;
    /**
     * 签名，用来校验
     */
    private String signature;

    /**
     * 加密方式
     * 0：明文
     * 1：兼容
     * 2：加密
     * <p>
     * 明文数据在data中，加密数据在encryptedData中，
     * 如果兼容，则数据在两个里面都有
     */
    private Integer encryptType;

    /**
     * 随机字符串
     */
    private String randomStr;
    /**
     * 不建议使用，
     * 仅提供序列化
     */
    private Message() {
    }

    /**
     * 加密时，生成的消息会添加签名
     *
     * @param encrypt
     * @param signature
     * @param timestamp
     * @param nonce
     */
    public Message(Integer encryptType, String encrypt, T data, String signature, String timestamp, String nonce) {
        setNonce(nonce);
        setSignature(signature);
        setTimeStamp(timestamp);
        setEncryptType(encryptType);
        switch (encryptType) {
            case 0: {
                //明文
                setData(data);
            }
            break;
            case 1: {
                //兼容
                setEncryptedData(encrypt);
                setData(data);
            }
            break;
            case 2: {
                //加密
                setEncryptedData(encrypt);
            }
            break;
        }
    }


    public Integer getPostType() {
        return postType;
    }

    public String getEncryptedData() {
        return encryptedData;
    }

    public void setEncryptedData(String encryptedData) {
        this.encryptedData = encryptedData;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public String getTimeStamp() {
        return timeStamp;
    }

    public void setTimeStamp(String timeStamp) {
        this.timeStamp = timeStamp;
    }

    public String getNonce() {
        return nonce;
    }

    public void setNonce(String nonce) {
        this.nonce = nonce;
    }

    public String getSignature() {
        return signature;
    }

    public void setSignature(String signature) {
        this.signature = signature;
    }

    public Integer getEncryptType() {
        return encryptType;
    }

    public void setEncryptType(Integer encryptType) {
        this.encryptType = encryptType;
    }

    public String getRandomStr() {
        return randomStr;
    }

    public void setRandomStr(String randomStr) {
        this.randomStr = randomStr;
    }
}
